// Package custctrl
// @Author: zhangdi
package custctrl

import (
	"encoding/json"
	"path/filepath"
	"server/application/constant/keys"
	"server/application/db/schema/sentity"
	"server/application/db/schema/tables"
	"server/application/db/system/dbsvc"
	"server/application/dto"
	"server/application/dto/requestdto"
	"server/application/dto/responddto"
	"server/application/services/loginsvc"
	"server/pkg/ginp"
	"server/pkg/where"
	"server/setting"
)

func UserAccountCreate(ctx *ginp.ContextPro) {
	var params *sentity.UserAccount
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	//也可以自己创建并传入读写db: tables.NewUserAccount(wdb,rdb)
	info, err := tables.UserAccount.Create(params)
	if err != nil {
		ctx.ErrJson("创建失败" + err.Error())
		return
	}
	ctx.OkJsonData(info)
}

func UserAccountUpdate(ctx *ginp.ContextPro) {
	var params *sentity.UserAccount
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	wheres := where.Format(where.OptEqual("id", params.ID))
	//也可以自己创建并传入读写db: tables.NewUserAccount(wdb,rdb)
	err := tables.UserAccount.Update(wheres, params)
	if err != nil {
		ctx.ErrJson("修改失败" + err.Error())
		return
	}
	ctx.OkJson()
}

func UserAccountDelete(ctx *ginp.ContextPro) {
	var params *dto.CommonDelete
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}

	//也可以自己创建并传入读写db: tables.NewUserAccount(wdb,rdb)
	err := tables.UserAccount.Delete(where.FormatOne("id", "=", params.ID))
	if err != nil {
		ctx.ErrJson("删除失败" + err.Error())
		return
	}
	ctx.OkJson()
	return
}

func UserAccountSearch(ctx *ginp.ContextPro) {
	var params *dto.ReqSearch
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	//也可以自己创建并传入读写db: tables.NewUserAccount(wdb,rdb)
	list, total, err := tables.UserAccount.FindList(params.Wheres, params.Extra)
	if err != nil {
		ctx.ErrJson("查询失败" + err.Error())
		return
	}

	resp := &dto.RespSearch{
		List:     list,
		Total:    uint(total),
		PageNum:  uint(params.Extra.PageNum),
		PageSize: uint(params.Extra.PageSize),
	}
	ctx.OkJsonData(resp)

}

// UserAccountImport 导入excel文件
func UserAccountImport(ctx *ginp.ContextPro) {
	// 单个文件
	file, err := ctx.FormFile("file")
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}

	// 保存文件
	filePath := "./uploads/import/" + file.Filename
	err = ctx.SaveUploadedFile(file, filePath)
	if err != nil {
		ctx.ErrJson(err.Error())
		return

	}
	isCover := true //冲突时覆盖
	isCoverStr := ctx.PostForm("isCover")
	if isCoverStr == "false" {
		isCover = false //冲突时覆盖
	}

	//也可以自己创建并传入读写db: tables.NewUserAccount(wdb,rdb)
	err = tables.UserAccount.ImportData(filePath, isCover)
	if err != nil {
		ctx.ErrJson("导入失败，请检excel格式是否正确：" + err.Error())
		return
	}
	//返回成功
	ctx.OkJson()
}

// UserAccountImportTemplateFile 获取导入的模板文件
func UserAccountImportTemplateFile(ctx *ginp.ContextPro) {

	filePath, err := dbsvc.SaveImportTemplateFile(sentity.UserAccount{}, " UserAccount")
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}
	ctx.FileAttachment(filePath, "template_UserAccount.xlsx")
}

// UserAccountExport 导出数据
func UserAccountExport(ctx *ginp.ContextPro) {
	var params *dto.ReqSearch
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误:" + err.Error())
		return
	}
	file_path, err := tables.UserAccount.ExportData(params)
	if err != nil {
		ctx.ErrJson("导出失败:" + err.Error())
		return
	}
	ctx.FileAttachment(file_path, filepath.Base(file_path))
}

func UserAccountUserAccountCancelUser(ctx *ginp.ContextPro) {
	var params *requestdto.UserAccountUserAccountCancelUser
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	uid := ctx.GetLoginUserId()
	if uid == 0 {
		ctx.ErrJson("当前未登录")
		return
	}

	//软注销模式
	// updateData := sdto.UserAccountUpdate{
	// 	IsCancel: true,
	// }

	err := tables.UserAccount.Cancel(uid)

	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}

	ctx.OkJson()
}

// 获取app信息
func UserAccountUserAccountGetAppInfo(ctx *ginp.ContextPro) {
	var params *requestdto.UserAccountUserAccountGetAppInfo
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}

	dataStr, err := tables.AccountConfig.GetValue(0, keys.ConfSysAppInfo)
	if err != nil {
		ctx.ErrJson("获取APP信息失败:" + err.Error())
		return
	}

	var appInfo responddto.AppInfo
	json.Unmarshal([]byte(dataStr), &appInfo)
	appInfo.About.Version = setting.Version
	ctx.OkJsonData(appInfo)
}

func UserAccountLoginHuawei(ctx *ginp.ContextPro) {
	var params *requestdto.UserAccountLoginHuawei
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	//检测是否为空

	svc := loginsvc.NewHuaweiLoginService()
	unionId, err := svc.LoginVerify(params)
	if err != nil {
		ctx.ErrJson("华为token校验失败:" + err.Error())
		return
	}

	//登录信息校验通过，保存或更新用户信息
	userInfo, err := tables.UserAccount.CreateOrUpdateUser(params, unionId)
	if err != nil {
		ctx.ErrJson("创建或更新用户失败:" + err.Error())
		return
	}
	if userInfo.ID == 0 {
		ctx.ErrJson("用户不存在")
		return
	}

	//创建jwt
	token, err := loginsvc.GetJwtToken(userInfo.ID, userInfo.Username)
	if err != nil {
		ctx.ErrJson("创建token失败:" + err.Error())
		return
	}

	//对用户ID进行加密
	// wxBindKey, _ := utilsvc.EncryptUserId(userInfo.ID)
	ctx.OkJsonData(responddto.UserData{
		Token:          token,
		UserInfo:       userInfo,
		IsLoginSuccess: true,
		WxBindKey:      "",
	})

}

// 获取用户信息接口
func UserAccountGetInfo(ctx *ginp.ContextPro) {
	var params *requestdto.UserAccountGetInfo
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	userID := ctx.GetLoginUserId()
	if userID == 0 {
		ctx.ErrJson("当前未登录")
		return
	}

	userInfo, err := tables.UserAccount.FindOne(where.FormatOne("id", "=", userID))
	if err != nil {
		ctx.ErrJson("获取用户信息失败:" + err.Error())
		return
	}
	//对用户ID进行加密
	ctx.OkJsonData(responddto.UserData{
		Token:          ctx.GetToken(),
		UserInfo:       userInfo,
		IsLoginSuccess: true,
		WxBindKey:      "",
	})

}

// 获取APP信息接口
func UserAccountGetAppInfo(ctx *ginp.ContextPro) {
	var params *requestdto.UserAccountGetAppInfo
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}

	dataStr, err := tables.AccountConfig.GetValue(0, keys.ConfSysAppInfo)
	if err != nil {
		ctx.ErrJson("获取APP信息失败:" + err.Error())
		return
	}

	var appInfo responddto.AppInfo
	json.Unmarshal([]byte(dataStr), &appInfo)
	appInfo.About.Version = setting.Version
	ctx.OkJsonData(appInfo)
}
